summaryrefslogtreecommitdiff
path: root/src/pages/[...blog]/index.astro
diff options
context:
space:
mode:
authorDawid Rycerz <dawid@rycerz.xyz>2025-07-21 21:56:55 +0300
committerDawid Rycerz <dawid@rycerz.xyz>2025-07-21 21:56:55 +0300
commitc735556726e75428550a3d28a2cf58e2c8490b7d (patch)
treefd0ae29d1636b825abeedff6b99d3376bb383135 /src/pages/[...blog]/index.astro
Initial template
Diffstat (limited to 'src/pages/[...blog]/index.astro')
-rw-r--r--src/pages/[...blog]/index.astro54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/pages/[...blog]/index.astro b/src/pages/[...blog]/index.astro
new file mode 100644
index 0000000..421927c
--- /dev/null
+++ b/src/pages/[...blog]/index.astro
@@ -0,0 +1,54 @@
+---
+import type { InferGetStaticPropsType, GetStaticPaths } from 'astro';
+
+import merge from 'lodash.merge';
+import type { ImageMetadata } from 'astro';
+import Layout from '~/layouts/PageLayout.astro';
+import SinglePost from '~/components/blog/SinglePost.astro';
+import ToBlogLink from '~/components/blog/ToBlogLink.astro';
+
+import { getCanonical, getPermalink } from '~/utils/permalinks';
+import { getStaticPathsBlogPost, blogPostRobots } from '~/utils/blog';
+import { findImage } from '~/utils/images';
+import type { MetaData } from '~/types';
+import RelatedPosts from '~/components/blog/RelatedPosts.astro';
+
+export const prerender = true;
+
+export const getStaticPaths = (async () => {
+ return await getStaticPathsBlogPost();
+}) satisfies GetStaticPaths;
+
+type Props = InferGetStaticPropsType<typeof getStaticPaths>;
+
+const { post } = Astro.props as Props;
+
+const url = getCanonical(getPermalink(post.permalink, 'post'));
+const image = (await findImage(post.image)) as ImageMetadata | string | undefined;
+
+const metadata = merge(
+ {
+ title: post.title,
+ description: post.excerpt,
+ robots: {
+ index: blogPostRobots?.index,
+ follow: blogPostRobots?.follow,
+ },
+ openGraph: {
+ type: 'article',
+ ...(image
+ ? { images: [{ url: image, width: (image as ImageMetadata)?.width, height: (image as ImageMetadata)?.height }] }
+ : {}),
+ },
+ },
+ { ...(post?.metadata ? { ...post.metadata, canonical: post.metadata?.canonical || url } : {}) }
+) as MetaData;
+---
+
+<Layout metadata={metadata}>
+ <SinglePost post={{ ...post, image: image }} url={url}>
+ {post.Content ? <post.Content /> : <Fragment set:html={post.content || ''} />}
+ </SinglePost>
+ <ToBlogLink />
+ <RelatedPosts post={post} />
+</Layout>